package cz.vse.integrace.iag;

import cz.vse.integrace.iag.synchronizace.Synchronizace;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.ScheduleExpression;
import javax.ejb.Singleton;
import javax.ejb.Timeout;
import javax.ejb.Timer;
import javax.ejb.TimerConfig;
import javax.ejb.TimerService;

/**
 * Třída starající se plánovaní synchronizací a jejich spouštění, když nastane definovaný čas.
 * 
 * @author David Nejedly
 * @version 1.0
 */
@Singleton
public class IntegraceTimerBean {

    @Resource
    private TimerService timerService;
    @EJB
    private Synchronizace synchronizace;

    /**
     * Nastaví timer, aby synchronizace byla prováděna podle cron výrazu.
     *
     * @param cron cron, který má byt proveden
     */
    public void scheduleCron(String[] cron) {
        ScheduleExpression scheduleExpression = new ScheduleExpression();
        scheduleExpression.second(cron[0]).minute(cron[1]).hour(cron[2]).dayOfMonth(cron[3]).month(cron[4]).dayOfWeek(cron[5]);
        if (cron.length > 6) {
            scheduleExpression.year(cron[6]);
        }
        TimerConfig timerConfig = new TimerConfig();
        timerService.createCalendarTimer(scheduleExpression, timerConfig);
    }

    /**
     * Nastaví timer, aby synchronizace byla provedena v určité datum.
     *
     * @param date datum synchronizace
     */
    public void scheduleDate(Date date) {
        TimerConfig timerConfig = new TimerConfig();
        timerService.createSingleActionTimer(date, timerConfig);
    }

    /**
     * Metoda, pokud nastane timeout, tak synchronizuje.
     *
     * @param timer timer pro synchronizaci
     */
    @Timeout
    public void synchonyzace(Timer timer) {
        try {
            if (synchronizace.synchronizace()) {
                Logger.getLogger(IntegraceTimerBean.class.getName()).log(Level.INFO, "Byla provedna úspěšná synchronizace!");
            } else {
                Logger.getLogger(IntegraceTimerBean.class.getName()).log(Level.INFO, "Byla provedna neúspěšná synchronizace!");
            }
        } catch (Exception ex) {
            Logger.getLogger(IntegraceTimerBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Rušení zadaného timer.
     *
     * @param timer timer ke stopnutí
     */
    public void cancel(Timer timer) {
        timer.cancel();
    }

    /**
     * Metoda vrací následující timout timeru.
     *
     * @param timer timer pro který chceme zjistit timeout
     * @return následující timeout
     */
    public Date getNextTimeout(Timer timer) {
        return timer.getNextTimeout();
    }
}
